我正在使用 ASP.NET MVC 的新 WebAPI 开发 Web 服务,它将提供二进制文件,主要是.cab文件.exe。
.cab
.exe
以下控制器方法似乎有效,这意味着它返回一个文件,但它将内容类型设置为application/json:
application/json
public HttpResponseMessage<Stream> Post(string version, string environment, string filetype) { var path = @"C:\Temp\test.exe"; var stream = new FileStream(path, FileMode.Open); return new HttpResponseMessage<Stream>(stream, new MediaTypeHeaderValue("application/octet-stream")); }
有一个更好的方法吗?
尝试使用一个简单HttpResponseMessage的Content属性设置为 a StreamContent:
HttpResponseMessage
Content
StreamContent
// using System.IO; // using System.Net.Http; // using System.Net.Http.Headers; public HttpResponseMessage Post(string version, string environment, string filetype) { var path = @"C:\Temp\test.exe"; HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); var stream = new FileStream(path, FileMode.Open, FileAccess.Read); result.Content = new StreamContent(stream); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); return result; }
关于使用的一些注意事项stream:
stream
您不能调用,因为 Web API 在处理控制器方法以将数据发送回客户端stream.Dispose()时仍然需要能够访问它。result因此,不要使用using (var stream = 鈥�)块。Web API 将为您处理流。
stream.Dispose()
result
using (var stream = 鈥�)
确保流的当前位置设置为 0(即流数据的开头)。在上面的示例中,这是给定的,因为您刚刚打开了文件。但是,在其他情况下(例如当您第一次将一些二进制数据写入 a 时) ,MemoryStream请确保stream.Seek(0, SeekOrigin.Begin);``stream.Position = 0;
MemoryStream
stream.Seek(0, SeekOrigin.Begin);``stream.Position = 0;
对于文件流,明确指定FileAccess.Read权限有助于防止 Web 服务器上的访问权限问题;IIS 应用程序池帐户通常只被授予对 wwwroot 的读取/列出/执行访问权限。
FileAccess.Read